import { useBaseApi } from '/@/api/base';

// 延期范围枚举
export enum DelayRangeEnum {
	Light = 1, // 轻微延期：1-3天
	Medium = 2, // 中等延期：4-7天
	Severe = 3, // 严重延期：7天以上
	All = 4, // 全部延期
}

// 延期通知类型枚举
export enum DelayNotificationTypeEnum {
	Start = 1, // 开工延期通知
	End = 2, // 完工延期通知
	All = 3, // 全部延期通知
}

// 基础筛选参数
export interface PlanDelayAllInput {
    workTime?: string; // 兼容保留，优先使用 rangeStart/rangeEnd
    // 显式业务范围（起止时间，前端已计算好的范围，格式：YYYY-MM-DDTHH:mm:ss.SSS）
    rangeStart?: string;
    rangeEnd?: string;
    className?: number; // 分类ID
    workAreaId?: number; // 区域ID
    planStart?: boolean; // true:已开工/已完工, false:未开工/未完工
}

// 开工/完工筛选参数
export interface PlanDelayStartInput extends PlanDelayAllInput {
	// planStart 字段继承自 PlanDelayAllInput
}

// 延期统计参数
export interface PlanDelayCount extends PlanDelayStartInput {
	delayRange?: DelayRangeEnum; // 延期范围
	planCount?: number; // 延期天数阈值
}

// 延期看板专用输入参数
export interface PlanDelayBoardInput extends PlanDelayAllInput {
    minDelayDays?: number; // 最小延期天数，默认3天
}

// 简单下拉项
export interface OptionDto {
    value: number | null;
    label: string;
}

// 统计数据输出
export interface PlanDelayStatusOutput {
	allPlanCount: number; // 筛选月份内计划开工总数
	allActualCount: number; // 筛选月份内实际开工总数
	allPlanEndCount: number; // 筛选月份内计划完工总数
	allActualEndCount: number; // 筛选月份内实际完工总数
	delayPlanCount: number; // 延期计划数
	delayActualCount: number; // 延期实际数
	delayPlanRate: number; // 计划延期率
	delayActualRate: number; // 实际延期率
	shouldStartedCount: number; // 到时间应开工总数
	shouldFinishedCount: number; // 到时间应完工总数
}

// 图表数据输出
export interface PlanDelayChartsOutput {
	categories: string[]; // 分类/区域名称列表
	totalCounts: number[]; // 总计划数列表
	delayCounts: number[]; // 延期计划数列表
	delayRates: number[]; // 延期率列表
}

// 延期明细输出
export interface PlanDelayOutputList {
	Ch: string; // 船号
	Fd: string; // 分段
	ClassName: string; // 分类名称
	WorkArea: string; // 区域名称
	Team: string; // 劳务队
	PlanStart?: string; // 计划开工
	PlanEnd?: string; // 计划完工
	ActualStart?: string; // 实际开工
	ActualEnd?: string; // 实际完工
	Delay: number; // 延期天数
}

// 延期通知推送输入参数
export interface DelayNotificationInput extends PlanDelayAllInput {
	notificationType?: DelayNotificationTypeEnum; // 通知类型
	delayLevels?: DelayRangeEnum[]; // 延期等级筛选（可多选）
	targetWorkAreaIds?: number[]; // 指定作业区域ID列表（可选）
	excludeUserIds?: number[]; // 排除的用户ID列表（可选）
	customMessage?: string; // 自定义消息内容（可选）
}

// 延期通知详情
export interface DelayNotificationDetail {
	workAreaId?: number; // 作业区域ID
	workAreaName: string; // 作业区域名称
	delayItemCount: number; // 该区域的延期项目数量
	severeDelayCount: number; // 严重延期数量（>7天）
	mediumDelayCount: number; // 中等延期数量（4-7天）
	lightDelayCount: number; // 轻微延期数量（1-3天）
	notifiedUserIds: number[]; // 推送的用户ID列表
	notifiedUserNames: string[]; // 推送的用户姓名列表
}

// 延期通知推送输出结果
export interface DelayNotificationOutput {
	success: boolean; // 推送成功
	totalDelayCount: number; // 推送的延期项目总数
	affectedWorkAreaCount: number; // 推送的作业区域数量
	notifiedUserCount: number; // 推送的用户数量
	details: DelayNotificationDetail[]; // 推送详情
	errorMessage?: string; // 错误消息（如果推送失败）
	notificationTime: string; // 推送时间
}

// 计划延期视图接口服务
export const usePlanDelayViewApi = () => {
	const baseApi = useBaseApi('PlanDelayViews');
	return {
		// 获取延期状态统计
		getPlanDelayStatus: (data: PlanDelayStartInput = {}, cancel: boolean = false) =>
			baseApi.request(
				{
					url: baseApi.baseUrl + 'GetPlanDelayStatus',
					method: 'post',
					data,
				},
				cancel
			),

		// 获取各区域延期图表数据
		getAreaDelayCharts: (data: PlanDelayAllInput = {}, cancel: boolean = false) =>
			baseApi.request(
				{
					url: baseApi.baseUrl + 'GetAreaDelayCharts',
					method: 'post',
					data,
				},
				cancel
			),

		// 获取各分类延期图表数据
		getClassDelayCharts: (data: PlanDelayAllInput = {}, cancel: boolean = false) =>
			baseApi.request(
				{
					url: baseApi.baseUrl + 'GetClassDelayCharts',
					method: 'post',
					data,
				},
				cancel
			),

		// 获取开工延期明细列表
		getPlanStartDelayOutList: (data: PlanDelayCount = {}, cancel: boolean = false) =>
			baseApi.request(
				{
					url: baseApi.baseUrl + 'GetPlanStartDelayOutList',
					method: 'post',
					data,
				},
				cancel
			),

		// 获取完工延期明细列表
		getPlanEndDelayOutList: (data: PlanDelayCount = {}, cancel: boolean = false) =>
			baseApi.request(
				{
					url: baseApi.baseUrl + 'GetPlanEndDelayOutList',
					method: 'post',
					data,
				},
				cancel
			),

		// 发送延期通知给相关作业区人员
		sendDelayNotifications: (data: DelayNotificationInput = {}, cancel: boolean = false) =>
			baseApi.request(
				{
					url: baseApi.baseUrl + 'SendDelayNotifications',
					method: 'post',
					data,
				},
				cancel
			),

		// 预览延期通知接收人
		previewNotificationRecipients: (data: DelayNotificationInput = {}, cancel: boolean = false) =>
			baseApi.request(
				{
					url: baseApi.baseUrl + 'PreviewNotificationRecipients',
					method: 'post',
					data,
				},
				cancel
			),

		// 导出开工延期明细Excel
		exportPlanStartDelayExcel: (data: PlanDelayCount = {}, cancel: boolean = false) =>
			baseApi.request(
				{
					responseType: 'blob',
					url: baseApi.baseUrl + 'ExportPlanStartDelayExcel',
					method: 'post',
					data,
				},
				cancel
			),

		// 导出完工延期明细Excel
		exportPlanEndDelayExcel: (data: PlanDelayCount = {}, cancel: boolean = false) =>
			baseApi.request(
				{
					responseType: 'blob',
					url: baseApi.baseUrl + 'ExportPlanEndDelayExcel',
					method: 'post',
					data,
				},
				cancel
			),

		// 延期看板专用接口 - 获取开工延期数据（支持动态延期天数）
		getPlanStartDelayForBoard: (data: PlanDelayBoardInput = {}, cancel: boolean = false) =>
			baseApi.request(
				{
					url: baseApi.baseUrl + 'GetPlanStartDelayForBoard',
					method: 'post',
					data,
				},
				cancel
			),

		// 延期看板专用接口 - 获取完工延期数据（支持动态延期天数）
		getPlanEndDelayForBoard: (data: PlanDelayBoardInput = {}, cancel: boolean = false) =>
			baseApi.request(
				{
					url: baseApi.baseUrl + 'GetPlanEndDelayForBoard',
					method: 'post',
					data,
				},
				cancel
			),

		// 获取延期看板可用的作业区下拉
		getWorkAreasForBoard: (data: PlanDelayAllInput = {}, cancel: boolean = false) =>
			baseApi.request<unknown, { data: { result: OptionDto[] } }>(
				{
					url: baseApi.baseUrl + 'GetWorkAreasForBoard',
					method: 'post',
					data,
				},
				cancel
			),
	};
};

// 导出API实例
export const planDelayViewApi = usePlanDelayViewApi();
